﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.IO;
using System.Collections.ObjectModel;
using System.Threading;
using System.Globalization;
using System.Windows.Controls.Primitives;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para frmAjuMP.xaml
    /// </summary>
    public partial class frmAjuMP : Window
    {
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        CLSENCSAL EncSal = new CLSENCSAL();
        CLSDETSAL DetSal = new CLSDETSAL();
        CLSENCENT EncEnt = new CLSENCENT();
        CLSDETENT DetEnt = new CLSDETENT();
        CLSMAEMAT MaeMat = new CLSMAEMAT();        
        CLSMAEMTP MaeMtp = new CLSMAEMTP();
        CLSCONTROLP Control = new CLSCONTROLP();
        CLSCONORD ConOrd = new CLSCONORD();
        ObservableCollection<RegDetAju> Lista = new ObservableCollection<RegDetAju>();

        Boolean BooInformacionGuardada;//FJRF - Variable que nos informara si se han guardado o no los datos
        String StrCodigoAntesDeSerBorrado = "";//FJRF - Para tener el codigo del proceso antes de ser borrado

        public frmAjuMP()
        {
            InitializeComponent();
        }

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            dtFecSal.DisplayDateStart = MDOgeneral.DttFechaInicialDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas iniciales que debe mostrar
            dtFecSal.DisplayDateEnd = MDOgeneral.DttFechaFinalDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas finales que debe mostrar

            Control.ID_CON = "ENT";
            Control.COD_CON = "AJU";
            Control.Consultar();
            if (Control.NOM_CON != "")
            {
                txtHojNroEn.Text = Control.NOM_CON.Substring(0, 2) + (System.Convert.ToInt64(Control.NOM_CON.Substring(2, 5)) + 1).ToString("00000");
            }

            Control.ID_CON = "SAL";
            Control.COD_CON = "AJU";
            Control.Consultar();
            if (Control.NOM_CON != "")
            {
                txtHojNroSal.Text = Control.NOM_CON.Substring(0, 2) + (System.Convert.ToInt64(Control.NOM_CON.Substring(2, 5)) + 1).ToString("00000");
            }
            LimpiarControles();

            BooInformacionGuardada = false;//FJRF - Informamos que no se ha guardado ningun dato
            txtConcepto.Style = null;//FJRF - Le quitamos el estilo para poder controlar el foco del objeto
            txtConcepto.Focus();//FJRF - Ponemos el foco en el concepto
        }

        private void LimpiarControles()
        {
            dtFecSal.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema
            Lista.Clear();
            dgAju.ItemsSource = null;
            txtConcepto.Text = "";
            imgFoto.Source = null;
            Lista.Add(new RegDetAju { MATERIAL = "", DESCRIPCION = "", STOCK = 0, AJUSTE = 0, NUEVO = 0 });
            dgAju.ItemsSource = Lista;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                //System.Windows.Forms.SendKeys.Send("{TAB}");
                KeyEventArgs e1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource,
                                 0, Key.Tab);
                e1.RoutedEvent = Keyboard.KeyDownEvent;
                InputManager.Current.ProcessInput(e1);
            }
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }
        private void dgAju_KeyUp(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            int i = IntFilaIndexada;
            int j = IntColumnaIndexada;

            RegDetAju Rg = new RegDetAju();
            if (j == 0)
            {
                if (e.Key == Key.F2)
                {
                    FRMBuscarCol frm = new FRMBuscarCol();
                    frm.EsReferencia = false;
                    frm.RequiereColor = true;
                    frm.ShowDialog();
                    if (frm.Retorno == "")
                    {
                        for (int k = 0; k < frm.dtRetorno.Rows.Count; k++)
                        {
                            if ((k + i) > i)
                            {
                                Lista.Add(new RegDetAju { MATERIAL = "" });
                            }
                            Rg = Lista[(i + k)];
                            Rg.MATERIAL = frm.dtRetorno.Rows[k][0].ToString();
                        }
                    }
                    else
                    {
                        Rg = Lista[i];
                        Rg.MATERIAL = MdoGeneral.PasarCadenaYRetornarCodigoONombre(frm.Retorno, "-", "Codigo");//FJRF - Separamos el codigo
                    }
                }
                else
                {
                    try//FJRF - Esto lo usamos para validar cualquier dato que venga con error en el manejo de las columnas (Puede ser al mover el mouse)
                    {
                        if (IntColumnaIndexada == 0)//FJRF - Si la columna es donde esta el codigo entonces hacemos lo siguiente
                        {
                            RegDetAju RgMP = new RegDetAju();//FJRF - Instanciamos los datos
                            RgMP = Lista[i]; ;//FJRF - Le decimos con que datos vamos a trabajar
                            if (RgMP != null)//FJRF - Validamos que no sea nulo el dato seleccionado
                            {
                                String StrCodigoActual = RgMP.MATERIAL;////FJRF - Extraemos el codigo seleccionado

                                if (StrCodigoActual.Length < 10)//FJRF - Si el codigo es menor a 10 hacemos lo siguiente
                                {
                                    if (RgMP.AJUSTE < 0)
                                    {
                                        if (StrCodigoAntesDeSerBorrado.Length == 10)//FJRF - Si tiene algun codigo hacemos lo siguiente
                                        {
                                            MaeMtp.CODMAT_MTP = StrCodigoAntesDeSerBorrado.Substring(0, 6);
                                            MaeMtp.CODCOL_MTP = StrCodigoAntesDeSerBorrado.Substring(6, 4);
                                            MaeMtp.CANSEP_MTP = RgMP.AJUSTE;
                                            MaeMtp.SumarSep();

                                            RgMP.DESCRIPCION = "";
                                            RgMP.STOCK = 0;
                                            RgMP.AJUSTE = 0;
                                            RgMP.NUEVO = 0;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
                    {
                    }
                }
            }
        }

        private void dgAju_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (e.Column.Header.ToString().ToUpper().Trim() == "MATERIAL")
            {
                int i = dgAju.SelectedIndex;
                if (i == -1)
                {
                    return;
                }
                string strCodigo;
                RegDetAju RgMP = new RegDetAju();
                RgMP = (RegDetAju)e.Row.Item;
                strCodigo = RgMP.MATERIAL;
                if (strCodigo.Length > 10)
                {
                    MessageBox.Show("La longitud debe ser menor de 10 caracteres", "Ajustes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    RgMP.MATERIAL = "";
                    RgMP.DESCRIPCION = "";
                    return;
                }
                if (strCodigo.Length == 10)
                {
                    if (!EncSal.ExisteMP(strCodigo.ToString().Substring(0, 6), strCodigo.ToString().Substring(6, 4)))
                    {
                        MessageBox.Show("La materia prima no existe", "Ajustes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        RgMP.MATERIAL= "";
                        RgMP.DESCRIPCION = "";
                        return;
                    }
                }
                else
                {
                    FRMBuscarCol frm = new FRMBuscarCol();
                    frm.EsReferencia = false;
                    frm.RequiereColor = true;
                    frm.txtNombre.Text = strCodigo;
                    frm.ShowDialog();
                    if (frm.Retorno == "")
                    {
                        for (int k = 0; k < frm.dtRetorno.Rows.Count; k++)
                        {
                            if ((k + i) > i)
                            {
                                Lista.Add(new RegDetAju { MATERIAL = "" });
                            }
                            RgMP = Lista[(i + k)];
                            RgMP.MATERIAL = frm.dtRetorno.Rows[k][0].ToString();
                        }
                    }
                    else
                    {
                        RgMP = Lista[i];
                        RgMP.MATERIAL = frm.Retorno;
                    }
                }
            }

            if (e.Column.Header.ToString().ToUpper().Trim() == "AJUSTE")
            {
                string strCodigo;
                double dblCant;
                RegDetAju RgMP = new RegDetAju();
                RgMP = (RegDetAju)e.Row.Item;
                if (RgMP.MATERIAL == "" || RgMP.MATERIAL == null)
                {
                    return;
                }
                strCodigo = RgMP.MATERIAL;
                dblCant = RgMP.AJUSTE;
                DetSal.CODMAT_DSA = strCodigo.Substring(0, 6);
                DetSal.CODCOL_DSA = strCodigo.Substring(6, 4);
                if (RgMP.AJUSTE < 0)
                {
                    dblCant = dblCant * (-1);
                    if (dblCant > RgMP.STOCK)
                    {
                        MessageBox.Show("La cantidad supera a la existencia!", "Salida de MP", MessageBoxButton.OK, MessageBoxImage.Warning);
                        RgMP.AJUSTE = 0;
                        return;
                    }
                }

                if (RgMP.AJUSTE < 0 & strCodigo != "")
                {
                    MaeMtp.CODMAT_MTP = strCodigo.Substring(0, 6);
                    MaeMtp.CODCOL_MTP = strCodigo.Substring(6, 4);
                    MaeMtp.CANSEP_MTP = (dblCant)*-1;
                    MaeMtp.SumarSep();
                }
            }
            StrCodigoAntesDeSerBorrado = "";//FJRF - Borramos el dato
        }

        private void dgAju_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
        {
            string strCodigo;
            if (dgAju.SelectedIndex.Equals(-1))
            {
                return;
            }
            RegDetAju RgMP = new RegDetAju();
            RgMP = (RegDetAju)e.Row.Item;
            if (RgMP.MATERIAL == "" || RgMP.MATERIAL == null)
            {
                return;
            }
            strCodigo = RgMP.MATERIAL;

            DetSal.CODMAT_DSA = strCodigo.Substring(0, 6);

            if (strCodigo.Equals("") || strCodigo == null)
            {
                return;
            }
            int i = dgAju.SelectedIndex; 

            if (dgAju.CurrentCell.Column != null)
            {
                int j = dgAju.CurrentCell.Column.DisplayIndex;
                int k = 0;
                RegDetAju Rg = new RegDetAju();
                for (k = 0; k < Lista.Count; k++)
                {
                    if (k != i)
                    {
                        RgMP = Lista[k];
                        if (RgMP.MATERIAL.ToString() == strCodigo)
                        {
                            MessageBox.Show("El código de material ya ha sido ingresado!", "Salida de MP", MessageBoxButton.OK, MessageBoxImage.Warning);
                            RgMP = (RegDetAju)e.Row.Item;
                            RgMP.MATERIAL = "";
                            RgMP.DESCRIPCION = "";
                            return;
                        }
                    }
                }   
            }
        }

        private void dgAju_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            string strCodigo;
            double dblCant;

            String strNombreColumna = e.Column.Header.ToString().ToUpper().Trim();//FJRF - Extraemos el nombre de la columna
            if (strNombreColumna == "MATERIAL")
            {
                RegDetAju RgMP = new RegDetAju();
                RgMP = (RegDetAju)e.Row.Item;
                if (RgMP.MATERIAL == "" || RgMP.MATERIAL == null)
                {
                    return;
                }
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_ARTESA + RgMP.MATERIAL + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_ARTESA + RgMP.MATERIAL + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                }
                else
                {
                    imgFoto.Source = null;
                }
                strCodigo = RgMP.MATERIAL;

                if (strCodigo.Length == 10) { StrCodigoAntesDeSerBorrado = strCodigo; }//FJRF - Capturamos el codigo antes de cualquier porceso

                dblCant = RgMP.AJUSTE;
                if (dblCant < 0)
                {
                    MaeMtp.CODMAT_MTP = strCodigo.Substring(0, 6);
                    MaeMtp.CODCOL_MTP = strCodigo.Substring(6, 4);
                    MaeMtp.CANSEP_MTP = dblCant;
                    MaeMtp.RestarSep();

                    RgMP.AJUSTE = 0;
                    RgMP.NUEVO = 0;
                }
            }
            else
            {
                if (strNombreColumna == "AJUSTE")
                {
                    RegDetAju RgMP = new RegDetAju();
                    RgMP = (RegDetAju)e.Row.Item;
                    if (RgMP.MATERIAL == "" || RgMP.MATERIAL == null)
                    {
                        return;
                    }
                    BitmapImage b = new BitmapImage();
                    if (File.Exists(MDOgeneral.Fotos_ARTESA + RgMP.MATERIAL + ".jpg"))
                    {
                        b.BeginInit();
                        b.UriSource = new Uri(MDOgeneral.Fotos_ARTESA + RgMP.MATERIAL + ".jpg");
                        b.EndInit();
                        imgFoto.Stretch = Stretch.Fill;
                        imgFoto.Source = b;
                    }
                    else
                    {
                        imgFoto.Source = null;
                    }
                    strCodigo = RgMP.MATERIAL;

                    if (strCodigo.Length == 10) { StrCodigoAntesDeSerBorrado = strCodigo; }//FJRF - Capturamos el codigo antes de cualquier porceso

                    dblCant = RgMP.AJUSTE;
                    if (dblCant < 0)
                    {
                        MaeMtp.CODMAT_MTP = strCodigo.Substring(0, 6);
                        MaeMtp.CODCOL_MTP = strCodigo.Substring(6, 4);
                        MaeMtp.CANSEP_MTP = dblCant;
                        MaeMtp.RestarSep();
                    }
                }
            }
        }

        private void btnGrabar_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                bool HayEntrada, HaySalida;
                RegDetAju Rg = new RegDetAju();
                HaySalida = false;
                HayEntrada = false;

                if (txtConcepto.Text == "")
                {
                    MessageBox.Show("Debe ingresar el concepto!", "Grabar ajustes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    return;
                }

                for (int i = 0; i < Lista.Count; i++)
                {
                    Rg = Lista[i];
                    if (Rg.MATERIAL != "")
                    {
                        if (Rg.AJUSTE > 0)
                        {
                            HayEntrada = true;
                        }
                        if (Rg.AJUSTE < 0)
                        {
                            HaySalida = true;
                        }
                    }
                }

                if (HayEntrada == false && HaySalida == false)
                {
                    return;
                }

                for (int i = 0; i < Lista.Count; i++)
                {
                    Rg = Lista[i];
                    if (Rg.MATERIAL != "")
                    {
                        if (!EncSal.ExisteMP(Rg.MATERIAL.Substring(0, 6), Rg.MATERIAL.Substring(6, 4)))
                        {
                            MessageBox.Show("El código " + Rg.MATERIAL + " no existe!", "Grabar ajustes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            return;
                        }
                        if (Rg.AJUSTE < 0)
                        {
                            if (Rg.AJUSTE*(-1) > Rg.STOCK)
                            {
                                MessageBox.Show("El código " + Rg.MATERIAL + " no tiene existencia suficiente!", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                                return;
                            }
                        }
                    }
                }
                MDOgeneral.transaccion = MDOgeneral.conexion.BeginTransaction();
                if (HayEntrada)
                {
                    Control.ID_CON = "ENT";
                    Control.COD_CON = "AJU";
                    Control.Consultar();
                    if (Control.NOM_CON != "")
                    {
                        txtHojNroEn.Text = Control.NOM_CON.Substring(0, 2) + (System.Convert.ToInt64(Control.NOM_CON.Substring(2, 5)) + 1).ToString("00000");
                    }


                    EncEnt.TIPENT_EEN="A";
                    EncEnt.HOJNRO_EEN = txtHojNroEn.Text;
                    EncEnt.FECENT_EEN = System.Convert.ToDateTime(dtFecSal.Text);
                    EncEnt.CONCEP_EEN = txtConcepto.Text;
                    EncEnt.CODALM_EEN = " ";
                    EncEnt.CODPRV_EEN = " ";
                    EncEnt.DOCREF_EEN = " ";
                    if (EncEnt.existe() == false)
                    {
                        EncEnt.insertar();
                    }
                }
                if (HaySalida)
                {
                    Control.ID_CON = "SAL";
                    Control.COD_CON = "AJU";
                    Control.Consultar();
                    if (Control.NOM_CON != "")
                    {
                        txtHojNroSal.Text = Control.NOM_CON.Substring(0, 2) + (System.Convert.ToInt64(Control.NOM_CON.Substring(2, 5)) + 1).ToString("00000");
                    }
                    EncSal.TIPSAL_ESA = "A";
                    EncSal.HOJNRO_ESA = txtHojNroSal.Text;
                    EncSal.ESTADO_ESA = "C";
                    EncSal.FECSAL_ESA = System.Convert.ToDateTime(dtFecSal.Text);
                    EncSal.OBSSAL_ESA = txtConcepto.Text;
                    EncSal.NROORDP_ESA = " ";
                    EncSal.DESSAL_ESA = " ";
                    if (EncSal.ExisteSalida() == false)
                    {
                        EncSal.Insertar();
                    }
                }
                for (int i = 0; i < Lista.Count; i++)
                {
                    Rg = Lista[i];
                    if (Rg.MATERIAL != "")
                    {
                        if (Rg.AJUSTE > 0)
                        {
                            DetEnt.TIPENT_DEN = "A";
                            DetEnt.HOJNRO_DEN = txtHojNroEn.Text;
                            DetEnt.CODMAT_DEN = Rg.MATERIAL.Substring(0, 6);
                            DetEnt.CODCOL_DEN = Rg.MATERIAL.Substring(6, 4);
                            DetEnt.CANPRO_DEN = Rg.AJUSTE;
                            DetEnt.COSPRO_DEN = 0;
                            DetEnt.insertar();
                            MaeMtp.CODMAT_MTP = DetEnt.CODMAT_DEN;
                            MaeMtp.CODCOL_MTP = DetEnt.CODCOL_DEN;
                            MaeMtp.EXIMTP_MTP = Rg.AJUSTE;
                            MaeMtp.SumarExi();
                        }
                        else
                        {
                            DetSal.TIPSAL_DSA = "A";
                            DetSal.HOJNRO_DSA = txtHojNroSal.Text;
                            DetSal.CODMAT_DSA = Rg.MATERIAL.Substring(0, 6);
                            DetSal.CODCOL_DSA = Rg.MATERIAL.Substring(6, 4);
                            DetSal.CANPRO_DSA = Rg.AJUSTE*(-1);
                            DetSal.COSPRO_DSA = 0;
                            DetSal.CANSTN_DSA = 0;
                            DetSal.Insertar();
                            MaeMtp.CODMAT_MTP = DetSal.CODMAT_DSA;
                            MaeMtp.CODCOL_MTP = DetSal.CODCOL_DSA;
                            MaeMtp.CANSEP_MTP = Rg.AJUSTE;
                            MaeMtp.RestarSep();
                            MaeMtp.EXIMTP_MTP = DetSal.CANPRO_DSA;
                            MaeMtp.RestarExi();
                        }
                    }
                }
                
                MDOgeneral.transaccion.Commit();
                Control.ID_CON = "ENT";
                Control.COD_CON = "AJU";
                Control.NOM_CON = txtHojNroEn.Text;
                Control.Actualizar();
                Control.ID_CON = "SAL";
                Control.COD_CON = "AJU";
                Control.NOM_CON = txtHojNroSal.Text;
                Control.Actualizar();
                new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados correctamente.", true);

                LimpiarControles();
                BooInformacionGuardada = true;//FJRF - Informamos que se guardaron los datos
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al grabar los ajustes.", MessageBoxButton.OK, MessageBoxImage.Error);
                MDOgeneral.transaccion.Rollback();
                new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados correctamente.", false);
            }
        }

        private void dgAju_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales;//FJRF Creamos las variables que necesitamos para el proceso actual

            IntCantidadRegistros = dgAju.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid

            IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
            IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una

            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter || e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right && elemento != null)//FJRF - Si se presiono enter, elemento es diferente de nulo o usa las teclas de desplazamiento hacemos lo siguiente
            {
                if (IntFilaActual >= IntRegistrosActuales)//FJRF - Si la fila es mayor o igual a la cantidad de registros hacemos lo siguiente
                {
                    Lista.Add(new RegDetAju { MATERIAL = "", DESCRIPCION = "", STOCK = 0, AJUSTE = 0, NUEVO = 0 });//FJRF - Adicionamos un nuevo registro
                    dgAju.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista
                }
                if (e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right)//FJRF - Si usas las techas de navegacion hacemos lo siguiente
                {
                    //FJRF - No hacer nada para que el foco permanezca en el grid y lo comento aqui para que lo entiendan
                }
                else//FJRF - Si no esta usando las teclas de navegacion hacemos lo siguiente
                {
                    if (IntColumnaIndexada == 0)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                    {
                        e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                        SelectCellByIndex(dgAju, IntFilaIndexada, 3);//FJRF - Le decimos cual es la nueva posicion
                    }
                    else//FJRF - si no es la columna del codigo hacemos lo siguiente
                    {
                        //DataGridCell cell = GetCell(IntFilaIndexada, 0, dgSalida);
                        //cell.Background = new SolidColorBrush(Colors.AliceBlue);

                        if (IntColumnaIndexada == 3)//FJRF - Si la columna equivale a la cantidad entonces hacemos lo siguiente
                        {
                            e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                            SelectCellByIndex(dgAju, IntFilaActual, 0);//FJRF - Le decimos cual es la nueva posicion
                        }
                        else//FJRF - Si es cualquier otra celda hacemos lo siguiente
                        {
                            if (IntFilaActual <= IntRegistrosActuales)//FJRF - Si la fila es igual o menor a la cantidad de registros hacemos lo siguiente
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));//FJRF - Nos movemos a la siguiente posicion
                            }
                        }
                    }
                }
            }
        }

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        private void dtFecSal_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dtFecSal.SelectedDate != null)//FJRF - Verificamos que la fecha no venga nula
            {
                MDOgeneral.DttFechaDigitadaPorusuario = dtFecSal.SelectedDate.Value;//FJRF - Extraemos ls fecha digitada por el usuario

                if (btnGrabar.IsEnabled == true)//FJRF - Si el grabar esta habilitado hacemos la validacion
                {
                    #region FJRF - ValidamosFechaDigitada
                    if (MDOgeneral.DttFechaDigitadaPorusuario < MDOgeneral.DttFechaInicialDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada es menor a la fecha minima permitida y si lo es hacemos lo siguiente
                    {
                        Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToLongDateString() + " ] no puede ser inferior a la fecha minima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaInicialDeValidacionEnElSistema.ToLongDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
                        dtFecSal.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
                    }
                    else//FJRF - Si no es menor la fecha entonces hacemos lo siguiente
                    {
                        if (MDOgeneral.DttFechaDigitadaPorusuario > MDOgeneral.DttFechaFinalDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada el mayor a la fecha maxima permitida y si lo es hacemos lo siguiente
                        {
                            Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToLongDateString() + " ] no puede ser superior a la fecha maxima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaFinalDeValidacionEnElSistema.ToLongDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
                            dtFecSal.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
                        }
                    }
                    #endregion
                }
            }
        }

        #region FJRF - MsgboxPersonalizado
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        private void txtConcepto_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario digita enter entonces hacemos lo siguiente
            {
                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                SelectCellByIndex(dgAju, 0, 0);//FJRF - Le decimos cual es la nueva posicion
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            PttV_Salir();//FJRF - Nos salimos
        }
        protected void PttV_Salir()
        {
            PttV_LiberarCantidadesSeparadas();//FJRF - Liberamos las cantidades que tenga el grid
        }
        protected void PttV_LiberarCantidadesSeparadas()
        {
            if (BooInformacionGuardada == false && btnGrabar.IsEnabled == true)//FJRF - Si no se ha guardado ningun dato y el grabar esta habilitado [Si esta desabilitado significa que consulto algo entonces no se puede descontar nada]
            {
                RegDetAju Rg = new RegDetAju();
                for (int IntFilaActual1 = 0; IntFilaActual1 < Lista.Count; IntFilaActual1++)//FJRF - Recorremos la primera instancia
                {
                    Rg = Lista[IntFilaActual1];//FJRF - Empezamos a recorrer la segunda instancia
                    if (String.IsNullOrEmpty(Rg.MATERIAL) == false)//FJRF - Si el codigo es diferente de nulo o vacio
                    {
                        String StrCodigoRecorrido = Rg.MATERIAL.Trim().Replace("\r", "");//FJRF - Extraemos el codigo
                        if (String.IsNullOrEmpty(StrCodigoRecorrido) == false)//FJRF - Si el codigo tiene datos hacemos lo siguiente
                        {
                            if (StrCodigoRecorrido.Length == 10)//FJRF - Si es un codigo valido de 10 digitos hacemos lo siguiente
                            {
                                Double DblCantidadReparada = Rg.AJUSTE;//FJRF - Extraemos la cantidad
                                if (DblCantidadReparada < 0)//FJRF - Si la cantidad separada es mayor a 10 hacemos lo siguiente
                                {
                                    MaeMtp.CODMAT_MTP = StrCodigoRecorrido.Substring(0, 6);//FJRF - Enviamos el codigo de la materia prima
                                    MaeMtp.CODCOL_MTP = StrCodigoRecorrido.Substring(6, 4);//FJRF - Enviamos el codigo del color
                                    MaeMtp.CANSEP_MTP = DblCantidadReparada;//FJRF - Enviamos la cantidad separada
                                    MaeMtp.RestarSep();//FJRF - Restamos las cantidades separadas
                                }
                            }
                        }
                    }
                }
            }
        }

        private void dgAju_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
        {
            string strNombreColumna = "", StrCodigoDigitado = "";//FJRF - Variable que se  necesitan
            Double DblCantidadReservada = 0;//FJRF - 
            strNombreColumna = e.Column.Header.ToString().Trim().ToUpper();//FJRF - Extraemos el nombre de la columna

            TextBox textBox = (e.EditingElement as TextBox);//FJRF - Miramos que valor tiene la celda

            if (textBox == null)//FJRF - Si el objeto llega vacio
            {
                return;//FJRF - Si viene nulo nos salimos
            }

            if (String.IsNullOrEmpty(strNombreColumna) == false)//FJRF - Preguntamos si el nombre de la columna tiene datos
            {
                if (strNombreColumna == "MATERIAL")//FJRF - Si el dato de la columna es codigo entonces hacemos lo siguiente
                {
                    if (String.IsNullOrEmpty(textBox.Text.Trim().Replace("\r", "")) == false)//FJRF - Si tiene algun dato hacemos lo siguiente
                    {
                        StrCodigoDigitado = textBox.Text.Trim().Replace("\r", "");//FJRF - Asignamos el dato que tenga
                    }
                    else//FJRF - Si por el contrario no tiene datos hacemos lo siguiente
                    {
                        StrCodigoDigitado = "";//FJRF - Informamos que no tiene datos digitados dejandolo vacio
                    }
                    if (StrCodigoDigitado.Length == 10)//FJRF - Si el codigo digitado esta completo con los 10 caracteres entonces hacemos lo siguiente
                    {
                        RegDetAju RgMP = new RegDetAju();
                        RgMP = (RegDetAju)e.Row.Item;
                        if (RgMP.MATERIAL == "" || RgMP.MATERIAL == null)
                        {
                            return;
                        }
                        DblCantidadReservada = RgMP.AJUSTE;
                        if (DblCantidadReservada < 0)
                        {
                            MaeMtp.CODMAT_MTP = StrCodigoDigitado.Substring(0, 6);
                            MaeMtp.CODCOL_MTP = StrCodigoDigitado.Substring(6, 4);
                            MaeMtp.CANSEP_MTP = DblCantidadReservada;
                            MaeMtp.RestarSep();

                            RgMP.AJUSTE = 0;//FJRF - Limpiamos los datos
                            RgMP.NUEVO = 0;//FJRF - Limpiamos los datos
                        }
                    }
                }
            }
            //textBox.Background = new SolidColorBrush(Colors.Yellow);//FJRF - Le cambiamos el color a la celda
            textBox.Focus();//FJRF - Pone el foco en el objeto
        }


    }

    public class RegDetAju : ObservableObject
    {
        string material, descripcion;
        double stock, ajuste, nuevo;
        public string MATERIAL
        {
            get { return material; }
            set
            {
                material = value;
                CLSENCSAL EncSal = new CLSENCSAL();
                CLSDETSAL DetSal = new CLSDETSAL();
                if (material != null)
                {
                    if (material.Length == 10)
                    {
                        if (EncSal.ExisteMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4)))
                        {
                            DESCRIPCION = EncSal.NombreMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4));
                            if (STOCK.ToString() == "" || stock == 0)
                            {
                                STOCK = EncSal.ExistenciaMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4));
                            }
                        }
                    }
                }
                RaisePropertyChangedEvent("MATERIAL");
            }
        }

        public string DESCRIPCION
        {
            get { return descripcion; }
            set
            {
                descripcion = value.ToUpper();
                RaisePropertyChangedEvent("DESCRIPCION");
            }
        }

        public double STOCK
        {
            get { return stock; }
            set
            {
                stock = value;
                RaisePropertyChangedEvent("STOCK");
            }
        }

        public double AJUSTE
        {
            get { return ajuste; }
            set
            {
                ajuste = value;
                NUEVO = STOCK + AJUSTE;
                RaisePropertyChangedEvent("AJUSTE");
            }
        }

        public double NUEVO
        {
            get { return nuevo; }
            set
            {
                nuevo = value;
                RaisePropertyChangedEvent("NUEVO");
            }
        }
    }
}
